5.1 函数

函数可以说是各个编程语言都具备的东西,而在使用方面也是大同小异。

函数在我们的实际应用中是必须的一个东西,可以说是我们程序的重要组成部分。

本节将对函数进行详细讲解。

本节代码存放目录为 lesson13

什么是函数?

在我们之前的章节例子中,代码里面都会有func main(),这就是一个主函数,在我们的程序中有且只能有一个。

我们之前的代码都写在了main里面,那么如果我们的代码特别多的时候,这样显然是不行的。

一方面这样代码会写的很乱,一方面也不能达到我们的要求。

所以我们一般会将一些代码单独拿出来作为一部分,那么拿出来的这一部分我们就会单独写一个func放进去。

这就是函数的简单理解。

函数定义

函数定义的规则是固定的,通过func关键字进行声明。如下所示:

func printHello() {
    fmt.Println("Hello!")
}

在上面的代码中,我们定义了一个函数,专门用于打印输出固定的字符串。

func是一个固定的关键字,在声明函数的时候是必备的。

printHello表示函数名称,在Go语言中,同一个包下的函数名称必须是唯一的,这与其他语言有一些不同。

()表示函数的参数,接下来我们会讲到。

{}里面的就是函数体,这也是函数必备的内容。

那么我们应该如何调用呢?如下代码所示:

func main() {
    printHello()
}

在上面的代码中,我们直接在main函数中调用了printHello函数,这样就实现了函数的调用。

结果输出如下:

Hello!

函数传参及返回值

刚刚我们讲到了函数简单的定义及调用,同时我们讲到了()是作为函数传参的。

那么这是什么东西呢?在我们实际开发过程中,我们可能会有一些复杂的函数,比如说我们需要将打印的数据传进去,而不是固定的。

那么这种情况下我们就会需要使用到函数参数。如下代码所示:

func print(text string) {
    fmt.Println(text)
}

在上面的代码中,我们可以看到,我们增加了一个text参数,之后在函数体内进行了使用。

在调用方面,我们则可以这样:

print("我的参数内容")

结果输出如下:

我的参数内容

同样的,如果我们需要传递多个参数,那么我们可以这样:

func print1(text string, text2 string) {
    fmt.Println(text)
    fmt.Println(text2)
}

也可以简写为这样:

func print1(text, text2 string) {
    fmt.Println(text)
    fmt.Println(text2)
}

有的时候,我们需要在函数调用后得到一些值。

比如这个函数的作用是计算两个数字的和,那么计算后我们需要得到最终的结果。

所以这时候我们需要函数将值返回给我们。我们可以这样做:

func sum(a, b int) int {
    return a + b
}

在调用的时候,我们需要接收这个返回值,我们可以这样做:

sumResult := sum(1, 2)
fmt.Println(sumResult)

在上面的代码中,我们在调用时传入了两个参数:12

其中1就表示第一个参数,2表示第二个参数。

之后我们使用sumResult来接收了函数计算的返回值。

我们还可以将上面的函数进行简写,如下所示:

func sum2(a, b int) (s int) {
    s = a + b
    return
}

在上面的代码中,我们在函数返回的地方直接定义了:(s int),这就表示已经将返回值声明为了s,那么在底部只需要直接return就可以了。

关于函数传参,还有一个比较特殊的地方,那就是Go语言允许可变参

也就是说同一个类型,可以传递一个参数,也可以传递多个参数,如下所示:

func sum3(number ...int) (s int) {
    for _, n := range number {
        s += n
    }
    return
}

在上面的代码中,我们通过...将参数作为了一个可变参,可以传递一个参数进来,也可以传递很多个参数进来。

需要注意的是,一个函数只允许定一个可变参

调用方式如下所示,分别演示了传递一个参数与多个参数的调用方式:

fmt.Println(sum3(1))
fmt.Println(sum3(1, 2, 3))

函数作为参数

Go语言中,允许我们将一个函数作为另一个函数的参数传入。如下所示:

func funcParam(fn func(a, b int) int) int {
    a := 1
    b := 1
    return fn(a, b)
}

在上面的代码中,我们定义了一个函数为funxParam,同时将函数的参数定义为了一个函数。

函数接收两个int类型的参数,返回一个int类型的参数,在funcParam中,我们直接使用fn即可。

调用方式如下所示:

fmt.Println(funcParam(sum))

在上面的代码中,我们直接调用了funcParam,同时将我们之前定义的sum函数传递了进去。

需要注意的是,传入的函数参数、返回值,都需要与funcParam定义的一致。

结果输出如下:

2

闭包

Go语言中,我们可以通过匿名函数作为闭包使用。实现方式如下所示:

sumFunc := func(a, b int) int {
    return a + b
}
fmt.Println(sumFunc(1, 2))
fmt.Println(sumFunc(3, 4))

在上面的代码中,我们直接在main中定义了一个求和函数,将其赋值给了变量sumFunc

在调用的时候,我们直接使用sumFunc即可。

总的来说,也就是可以将函数作为一种类型进行声明使用。

小结

函数在我们的实际开发中是比较常用的,在之前我们还讲到了结构体方法,他们两者存在一些区别。

可以简单理解为,函数是独立的,而方法是与结构体进行关联的。

关于本节函数的讲解总结如下:

  • 使用func进行函数定义

  • 函数名称开头不能是数字

  • 可以传入多个参数

  • 可以返回多个参数

  • 可以使用可变参传递

  • 函数参数可以传入函数

  • 函数可以声明为一个变量进行使用

results matching ""

    No results matching ""